package net.lengwang.iot.middleware.packet.request;

import net.lengwang.iot.middleware.packet.ParsedPacket;

public class TimeSyncPacketParser {

    // 2.2.1网关授时上报示例：（网关→服务器）

    // | BE BE 0F 91 01 01 A2 11 11 11 11 17 08 10 11 35 00 01 00 00 EB EB |
    // | --- |

    // | 起始位置 (10进制) | 内容 (16进制) | 含义 | 备注 |
    // | --- | --- | --- | --- |
    // | 01 | BE BE | 起始位 | 固定值 |
    // | 03 | 0F | 总长度 | 固定值 |
    // | 04 | 91 | 命令 | 固定值 |
    // | 05 | 01 | 协议版本 | |
    // | 06 | 01 A2 | 序列号 | 每次传输，此序列号递增，最大65535，达到最大值后从1开始。 |
    // | 08 | 11 11 11 11 | GW ID | 网关编号 |
    // | 12 | 17 08 10 11 35 00 | GW传输时间 | BCD码，格式：“17年08月10日11时35分00秒”。 |
    // | 18 | 01 | NTP OK | 网关开机成功后是否曾授时成功过； 0 = 没有； 1 = 成功过； other = 未定义； |
    // | 19 | 00 00 | CRC16 | 设为00 00可以屏蔽CRC16校验的功能。 |
    // | 21 | EB EB | 结束位 | 固定值 |

    public static ParsedPacket parsePacket(ParsedPacket parsedPacket) {
        String hexPacket = parsedPacket.getParsedData();
        // 设置起始标志 (BE BE)
        parsedPacket.setStartFlag(hexPacket.substring(0, 4));
        // 设置数据包总长度 (0F)
        parsedPacket.setLength(hexPacket.substring(4, 6));
        // 设置命令类型 (91)
        parsedPacket.setCommand(hexPacket.substring(6, 8));
        // 设置协议版本 (01)
        parsedPacket.setProtocolVersion(hexPacket.substring(8, 10));
        // 设置序列号 (01 A2)
        parsedPacket.setSequenceNumber(hexPacket.substring(10, 14));
        // 设置网关ID (11 11 11 11)
        parsedPacket.setGatewayId(hexPacket.substring(14, 22));
        // 设置网关上传时间 (17 08 10 11 35 00)
        parsedPacket.setGatewayUploadTime(hexPacket.substring(22, 34));
        // 设置NTP状态 (01)
        parsedPacket.setNtpOk(hexPacket.substring(34, 36));
        // 设置CRC16校验码 (00 00)
        parsedPacket.setCrc16(hexPacket.substring(36, 40));
        // 设置结束标志 (EB EB)
        parsedPacket.setEndFlag(hexPacket.substring(40, 44));

        // 设置命令名称
        parsedPacket.setCommandName("网关授时");

        return parsedPacket;
    }
}
